// MayBe函子
class MayBe {
  static of(value) {
    return new MayBe(value);
  }
  constructor(value) {
    this._value = value;
  }
  map(fn) {
    // return MayBe.of(fn(this._value));
    return this.isNothing() ? MayBe.of(null) : MayBe.of(fn(this._value));
  }

  isNothing() {
    return this._value === null || this._value === undefined;
  }
}

let r = MayBe.of("Hello world").map((x) => x.toUpperCase());
console.log(r);

let m = MayBe.of(null).map((x) => x.toUpperCase());
console.log(m);

let n = MayBe.of(null)
  .map((x) => x.toUpperCase())
  .map((x) => null)
  .map((x) => x.split(" "));
console.log(n);
